/*
 * jfrmPrincipal.java
 *
 * Created on 05/11/2011, 00:43:49
 */
package br.ufc.si.poo.orkut.gui;

import br.ufc.si.poo.orkut.beans.comunidade.Comunidade;
import br.ufc.si.poo.orkut.beans.comunidade.ComunidadePrivada;
import br.ufc.si.poo.orkut.beans.forum.Forum;
import br.ufc.si.poo.orkut.beans.usuario.Usuario;
import br.ufc.si.poo.orkut.beans.usuario.UsuarioVip;
import br.ufc.si.poo.orkut.util.ArquivoPath;
import br.ufc.si.poo.orkut.util.MenuPopupOptions;
import br.ufc.si.poo.orkut.util.filecontrol.SaveSerialized;
import java.awt.AWTEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListModel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

/**
 *
 * @author italoney
 */
public class jfrmPrincipal extends javax.swing.JFrame implements ActionListener {

    //<editor-fold defaultstate="collapsed" desc="Membros privados">
    private Map<String, Comunidade> comunidades;
    private Map<String, Usuario> usuarios;
    private Map<String, Forum> foruns;
    private boolean salvo;
    private JPopupMenu popupMenu;
    private int MODO_SALVAR = 1;//salvar 1 = xml;2 = bytes

    //</editor-fold>        
    /** Creates new form jfrmPrincipal */
    public jfrmPrincipal() {

        //<editor-fold defaultstate="collapsed" desc="Mudar layout">
        // pegar o layout padaro do sistema
        String nativeLF = UIManager.getSystemLookAndFeelClassName();

        try {
            UIManager.setLookAndFeel(nativeLF);
        } catch (InstantiationException e) {
            JOptionPane.showMessageDialog(null, "Erro de layout", "Erro", JOptionPane.ERROR_MESSAGE);
        } catch (ClassNotFoundException e) {
            JOptionPane.showMessageDialog(null, "Erro de layout", "Erro", JOptionPane.ERROR_MESSAGE);
        } catch (UnsupportedLookAndFeelException e) {
            JOptionPane.showMessageDialog(null, "Erro de layout", "Erro", JOptionPane.ERROR_MESSAGE);
        } catch (IllegalAccessException e) {
            JOptionPane.showMessageDialog(null, "Erro de layout", "Erro", JOptionPane.ERROR_MESSAGE);
        }
        //</editor-fold>

        initComponents();
        //<editor-fold defaultstate="collapsed" desc="Inicializar Membros privados">

        comunidades = new HashMap<String, Comunidade>();
        usuarios = new HashMap<String, Usuario>();
        foruns = new HashMap<String, Forum>();

        //</editor-fold>

        jfrmMenu();
        this.MODO_SALVAR = readConfigFile(ArquivoPath.CONGIF_FILE);
        inicializarCampos();
        careegarDados();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPDadosAtuais = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        jlistForunsAtuais = new javax.swing.JList();
        jScrollPane6 = new javax.swing.JScrollPane();
        jListusuariosAtuais = new javax.swing.JList();
        jLabel6 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jlistComunidades = new javax.swing.JList();
        jLabel7 = new javax.swing.JLabel();
        jScrollPane7 = new javax.swing.JScrollPane();
        jlistForuns = new javax.swing.JList();
        jLabel3 = new javax.swing.JLabel();
        jScrollPane3 = new javax.swing.JScrollPane();
        jlistusuarios = new javax.swing.JList();
        jPanel2 = new javax.swing.JPanel();
        jbAdicionarMensagem = new javax.swing.JButton();
        jScrollPane5 = new javax.swing.JScrollPane();
        txtAreaMensagem = new javax.swing.JTextArea();
        jpRecados = new javax.swing.JPanel();
        jbAdicinarRecado = new javax.swing.JButton();
        jScrollPane4 = new javax.swing.JScrollPane();
        txtAreaRecado = new javax.swing.JTextArea();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem2 = new javax.swing.JMenuItem();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenuItem9 = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JPopupMenu.Separator();
        jMenuItem3 = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        jMenuItem6 = new javax.swing.JMenuItem();
        jMenuItem4 = new javax.swing.JMenuItem();
        jMenuItem5 = new javax.swing.JMenuItem();
        jMenu3 = new javax.swing.JMenu();
        jMenuItem7 = new javax.swing.JMenuItem();
        jMenuItem8 = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Orkut - [Principal]");
        setMinimumSize(new java.awt.Dimension(771, 734));
        setResizable(false);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });

        jPDadosAtuais.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Dados atuais", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Monospaced", 1, 14))); // NOI18N

        jlistForunsAtuais.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "jlistForunsAtuais" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        jlistForunsAtuais.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jlistForunsAtuais.setToolTipText("Foruns atuais");
        jlistForunsAtuais.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                jlistForunsAtuaisValueChanged(evt);
            }
        });
        jScrollPane2.setViewportView(jlistForunsAtuais);

        jListusuariosAtuais.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "jListusuariosAtuais" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        jListusuariosAtuais.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jListusuariosAtuais.setToolTipText("Usuários disponiveis");
        jListusuariosAtuais.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                jListusuariosAtuaisValueChanged(evt);
            }
        });
        jScrollPane6.setViewportView(jListusuariosAtuais);

        jLabel6.setText("Usuários");

        jLabel2.setText("Foruns");

        javax.swing.GroupLayout jPDadosAtuaisLayout = new javax.swing.GroupLayout(jPDadosAtuais);
        jPDadosAtuais.setLayout(jPDadosAtuaisLayout);
        jPDadosAtuaisLayout.setHorizontalGroup(
            jPDadosAtuaisLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPDadosAtuaisLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPDadosAtuaisLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel6)
                    .addComponent(jScrollPane6, javax.swing.GroupLayout.PREFERRED_SIZE, 224, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(jPDadosAtuaisLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 223, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel2))
                .addContainerGap(248, Short.MAX_VALUE))
        );
        jPDadosAtuaisLayout.setVerticalGroup(
            jPDadosAtuaisLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPDadosAtuaisLayout.createSequentialGroup()
                .addGroup(jPDadosAtuaisLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel6)
                    .addComponent(jLabel2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPDadosAtuaisLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 158, Short.MAX_VALUE)
                    .addComponent(jScrollPane6, javax.swing.GroupLayout.PREFERRED_SIZE, 157, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(16, Short.MAX_VALUE))
        );

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Dados relacionados", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Monospaced", 1, 14))); // NOI18N

        jLabel1.setText("Selecione uma comunidade");

        jlistComunidades.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "jlistComunidades" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        jlistComunidades.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jlistComunidades.setToolTipText("Comunidades disponíveis");
        jlistComunidades.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                jjlistComunidadesValueChanged(evt);
            }
        });
        jScrollPane1.setViewportView(jlistComunidades);

        jLabel7.setText("Foruns");

        jlistForuns.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "jlistForuns" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        jlistForuns.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jlistForuns.setToolTipText("Foruns da comunidade selecionada");
        jScrollPane7.setViewportView(jlistForuns);

        jLabel3.setText("Usuários:");

        jlistusuarios.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "jlistusuarios" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        jlistusuarios.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jlistusuarios.setToolTipText("Usuários da comunidade selecionada");
        jScrollPane3.setViewportView(jlistusuarios);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jLabel1))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(14, 14, 14)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel7)
                    .addComponent(jScrollPane7, javax.swing.GroupLayout.PREFERRED_SIZE, 226, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 218, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jLabel7)
                    .addComponent(jLabel3))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jScrollPane7, javax.swing.GroupLayout.Alignment.LEADING, 0, 0, Short.MAX_VALUE)
                    .addComponent(jScrollPane3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 158, Short.MAX_VALUE)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.LEADING, 0, 0, Short.MAX_VALUE))
                .addContainerGap())
        );

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Mensagem para forum", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Monospaced", 1, 14))); // NOI18N

        jbAdicionarMensagem.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/ufc/si/poo/orkut/gui/img/add.png"))); // NOI18N
        jbAdicionarMensagem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbAdicionarMensagemActionPerformed(evt);
            }
        });

        txtAreaMensagem.setColumns(20);
        txtAreaMensagem.setRows(5);
        txtAreaMensagem.setText("txtAreaMensagem");
        txtAreaMensagem.setToolTipText("Digite uma mensagem para o forum selecionado");
        jScrollPane5.setViewportView(txtAreaMensagem);

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane5, javax.swing.GroupLayout.PREFERRED_SIZE, 264, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jbAdicionarMensagem, javax.swing.GroupLayout.PREFERRED_SIZE, 44, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(15, Short.MAX_VALUE))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addComponent(jScrollPane5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jbAdicionarMensagem, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jpRecados.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Recado para usuário", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Monospaced", 1, 14))); // NOI18N

        jbAdicinarRecado.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/ufc/si/poo/orkut/gui/img/add.png"))); // NOI18N
        jbAdicinarRecado.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbAdicinarRecadoActionPerformed(evt);
            }
        });

        txtAreaRecado.setColumns(20);
        txtAreaRecado.setRows(5);
        txtAreaRecado.setText("txtAreaRecado");
        txtAreaRecado.setToolTipText("Deixe um recado para o usuário selecionado");
        jScrollPane4.setViewportView(txtAreaRecado);

        javax.swing.GroupLayout jpRecadosLayout = new javax.swing.GroupLayout(jpRecados);
        jpRecados.setLayout(jpRecadosLayout);
        jpRecadosLayout.setHorizontalGroup(
            jpRecadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jpRecadosLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jpRecadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jbAdicinarRecado, javax.swing.GroupLayout.PREFERRED_SIZE, 44, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 271, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(21, Short.MAX_VALUE))
        );
        jpRecadosLayout.setVerticalGroup(
            jpRecadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jpRecadosLayout.createSequentialGroup()
                .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jbAdicinarRecado, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        jMenu1.setText("Dados");

        jMenuItem2.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_B, java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/ufc/si/poo/orkut/gui/img/byte.png"))); // NOI18N
        jMenuItem2.setText("Serialização");
        jMenuItem2.setToolTipText("Salvar os dados em bytes");
        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem2ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem2);

        jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_X, java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/ufc/si/poo/orkut/gui/img/xml.png"))); // NOI18N
        jMenuItem1.setText("XML");
        jMenuItem1.setToolTipText("Salvar os dados em um aequivo xml");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem1);

        jMenuItem9.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem9.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/ufc/si/poo/orkut/gui/img/salvar.png"))); // NOI18N
        jMenuItem9.setText("Salvar");
        jMenuItem9.setToolTipText("Salvae dados");
        jMenuItem9.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem9ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem9);
        jMenu1.add(jSeparator1);

        jMenuItem3.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q, java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/ufc/si/poo/orkut/gui/img/sair.png"))); // NOI18N
        jMenuItem3.setText("Sair");
        jMenuItem3.setToolTipText("Asta la vista");
        jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem3ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem3);

        jMenuBar1.add(jMenu1);

        jMenu2.setText("Criar");

        jMenuItem6.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_U, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem6.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/ufc/si/poo/orkut/gui/img/usuario.png"))); // NOI18N
        jMenuItem6.setText("Novo Usuário");
        jMenuItem6.setToolTipText("Criar um novo usuário");
        jMenuItem6.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem6ActionPerformed(evt);
            }
        });
        jMenu2.add(jMenuItem6);

        jMenuItem4.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/ufc/si/poo/orkut/gui/img/comunidade.png"))); // NOI18N
        jMenuItem4.setText("Nova comunidade");
        jMenuItem4.setToolTipText("Criar uma nova Comunidade");
        jMenuItem4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem4ActionPerformed(evt);
            }
        });
        jMenu2.add(jMenuItem4);

        jMenuItem5.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/ufc/si/poo/orkut/gui/img/forum.png"))); // NOI18N
        jMenuItem5.setText("Novo Forum");
        jMenuItem5.setToolTipText("Criar um novo forum");
        jMenuItem5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem5ActionPerformed(evt);
            }
        });
        jMenu2.add(jMenuItem5);

        jMenuBar1.add(jMenu2);

        jMenu3.setText("Adicionar");
        jMenu3.setToolTipText("");

        jMenuItem7.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_U, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem7.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/ufc/si/poo/orkut/gui/img/usuario-comunidade.png"))); // NOI18N
        jMenuItem7.setText("Usuário em comunidade");
        jMenuItem7.setToolTipText("Relacionar um usuario com uma comunidade");
        jMenuItem7.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem7ActionPerformed(evt);
            }
        });
        jMenu3.add(jMenuItem7);

        jMenuItem8.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem8.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/ufc/si/poo/orkut/gui/img/forum-comunidade.png"))); // NOI18N
        jMenuItem8.setText("Forum em comunidade");
        jMenuItem8.setToolTipText("Relacionar um forum com uma comunidade");
        jMenuItem8.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem8ActionPerformed(evt);
            }
        });
        jMenu3.add(jMenuItem8);

        jMenuBar1.add(jMenu3);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jpRecados, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(73, 73, 73)
                        .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPDadosAtuais, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(18, 18, 18)
                .addComponent(jPDadosAtuais, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jPanel2, 0, 160, Short.MAX_VALUE)
                    .addComponent(jpRecados, javax.swing.GroupLayout.DEFAULT_SIZE, 160, Short.MAX_VALUE))
                .addContainerGap(27, Short.MAX_VALUE))
        );

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-771)/2, (screenSize.height-734)/2, 771, 734);
    }// </editor-fold>//GEN-END:initComponents

    private void jjlistComunidadesValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_jjlistComunidadesValueChanged

        //TODO corrigir null pointer exception
        Comunidade c = (Comunidade) jlistComunidades.getSelectedValue();
        DefaultListModel dlmUsuarios = new DefaultListModel();
        DefaultListModel dlmForuns = new DefaultListModel();
        try {
            for (Usuario u : c.getUsuarios()) {
                dlmUsuarios.addElement(u);
                //System.out.println(u);
            }
        } catch (NullPointerException ex) {
        }

        if (c instanceof ComunidadePrivada) {
            ComunidadePrivada cp = (ComunidadePrivada) c;
            for (Forum f : cp.getForuns()) {
                dlmForuns.addElement(f);
            }
            jlistForuns.setModel(dlmForuns);
        } else {
            dlmForuns = new DefaultListModel();
            jlistForuns.setModel(dlmForuns);
        }

        jlistusuarios.setModel(dlmUsuarios);

    }//GEN-LAST:event_jjlistComunidadesValueChanged

    private void jbAdicinarRecadoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbAdicinarRecadoActionPerformed
        if (jListusuariosAtuais.getSelectedValues().length > 0) {

            Usuario usuario = (Usuario) jListusuariosAtuais.getSelectedValue();
            if (txtAreaRecado.getText() != null && !txtAreaRecado.getText().equals("")) {
                String recado;
                if (usuario instanceof UsuarioVip) {

                    UsuarioVip uv = (UsuarioVip) usuario;
                    recado = txtAreaRecado.getText();
                    uv.adicionarRecado(recado);

                    this.usuarios.put(uv.getNome(), usuario);
                } else {
                    JOptionPane.showMessageDialog(null, "Esse usuário não pode receber recados", "Atenção", JOptionPane.WARNING_MESSAGE);
                }
            } else {
                JOptionPane.showMessageDialog(null, "Digite o recado ", "Atenção", JOptionPane.WARNING_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(null, "Selecione um usuario em 'USUARIOS ATUAIS'", "Atenção", JOptionPane.WARNING_MESSAGE);
        }
    }//GEN-LAST:event_jbAdicinarRecadoActionPerformed

    private void jbAdicionarMensagemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbAdicionarMensagemActionPerformed
        if (jlistForunsAtuais.getSelectedValues().length > 0) {
            Forum forum = (Forum) jlistForunsAtuais.getSelectedValue();
            if (txtAreaMensagem.getText() != null && !txtAreaMensagem.getText().equals("")) {
                String mensagem = txtAreaMensagem.getText();
                forum.adicionarMensagem(mensagem);
            } else {
                JOptionPane.showMessageDialog(null, "Digite a mensagem ", "Atenção", JOptionPane.WARNING_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(null, "Selecione um forum em 'FORUNS ATUAIS'", "Atenção", JOptionPane.WARNING_MESSAGE);
        }
    }//GEN-LAST:event_jbAdicionarMensagemActionPerformed

    private void jlistForunsAtuaisValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_jlistForunsAtuaisValueChanged
        jbAdicionarMensagem.setEnabled(true);
    }//GEN-LAST:event_jlistForunsAtuaisValueChanged

    private void jListusuariosAtuaisValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_jListusuariosAtuaisValueChanged
        jbAdicinarRecado.setEnabled(true);
    }//GEN-LAST:event_jListusuariosAtuaisValueChanged

    private void jMenuItem8ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem8ActionPerformed
        if (this.foruns.size() > 0) {

            if (this.comunidades.size() > 0) {
                jfrmAdicionarForumComunidade afc = new jfrmAdicionarForumComunidade(this.comunidades, this.usuarios, this.foruns);
                this.setVisible(false);
                afc.show();
            } else {
                JOptionPane.showMessageDialog(null, "Não existem comunidades disponíveis", "Erro", JOptionPane.ERROR_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(null, "Não existem foruns disponíveis", "Erro", JOptionPane.ERROR_MESSAGE);
        }
}//GEN-LAST:event_jMenuItem8ActionPerformed

    private void jMenuItem7ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem7ActionPerformed
        if (this.usuarios.size() > 0) {

            if (this.comunidades.size() > 0) {
                jfrmAdicionarUsuarioComunidade nu = new jfrmAdicionarUsuarioComunidade(this.comunidades, this.usuarios, this.foruns);
                this.setVisible(false);
                nu.show();
            } else {
                JOptionPane.showMessageDialog(null, "Não existem comunidades disponíveis", "Erro", JOptionPane.ERROR_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(null, "Não existem usuários disponíveis", "Erro", JOptionPane.ERROR_MESSAGE);
        }
}//GEN-LAST:event_jMenuItem7ActionPerformed

    private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem6ActionPerformed

        jfrmNovoUsuario novoUsuario = new jfrmNovoUsuario(this.comunidades, this.usuarios, this.foruns);
        novoUsuario.show();
        this.salvo = false;
        this.setVisible(false);
    }//GEN-LAST:event_jMenuItem6ActionPerformed

    private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem5ActionPerformed
        jfrmNovoForum novoForum = new jfrmNovoForum(comunidades, usuarios, foruns);
        novoForum.show();
        this.salvo = false;
        this.setVisible(false);
}//GEN-LAST:event_jMenuItem5ActionPerformed

    private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem4ActionPerformed
        jfrmNovaComunidade novaComunidade = new jfrmNovaComunidade(this.comunidades, this.usuarios, this.foruns);
        novaComunidade.show();
        this.salvo = false;
        this.setVisible(false);
}//GEN-LAST:event_jMenuItem4ActionPerformed

    private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem3ActionPerformed
        if (!this.salvo) {
            int resposta = JOptionPane.showConfirmDialog(null, "Algumas alterações não foram salvas, deseja salvá-las?",
                    "Atenção", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);

            if (resposta == JOptionPane.YES_OPTION) {
                salvarDados();
                System.exit(0);
            } else {
                System.exit(0);
            }
        }
}//GEN-LAST:event_jMenuItem3ActionPerformed

    private void jMenuItem9ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem9ActionPerformed
        salvarDados();
}//GEN-LAST:event_jMenuItem9ActionPerformed

    private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed
        int resposta = JOptionPane.showConfirmDialog(null, ArquivoPath.MSG_BYTE_OPCAO, "Atenção", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
        if (resposta == 0) {
            String bytes = "bytes";
            int h = bytes.hashCode();
            generateConfigFile("\n" + h);
            this.MODO_SALVAR = 2;
            this.salvo = false;
        }
    }//GEN-LAST:event_jMenuItem2ActionPerformed

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed
        int resposta = JOptionPane.showConfirmDialog(null, ArquivoPath.MSG_XML_OPCAO, "Atenção", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
        if (resposta == 0) {
            String xml = "xml";
            int h = xml.hashCode();
            generateConfigFile("\n" + h);
            this.MODO_SALVAR = 1;
        }
    }//GEN-LAST:event_jMenuItem1ActionPerformed

    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        if (!this.salvo) {
            int resposta = JOptionPane.showConfirmDialog(null, "Algumas alterações não foram salvas, deseja salvá-las?",
                    "Atenção", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);

            if (resposta == JOptionPane.YES_OPTION) {
                salvarDados();
            }
        }
    }//GEN-LAST:event_formWindowClosing

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new jfrmPrincipal().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JList jListusuariosAtuais;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JMenuItem jMenuItem4;
    private javax.swing.JMenuItem jMenuItem5;
    private javax.swing.JMenuItem jMenuItem6;
    private javax.swing.JMenuItem jMenuItem7;
    private javax.swing.JMenuItem jMenuItem8;
    private javax.swing.JMenuItem jMenuItem9;
    private javax.swing.JPanel jPDadosAtuais;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JScrollPane jScrollPane5;
    private javax.swing.JScrollPane jScrollPane6;
    private javax.swing.JScrollPane jScrollPane7;
    private javax.swing.JPopupMenu.Separator jSeparator1;
    private javax.swing.JButton jbAdicinarRecado;
    private javax.swing.JButton jbAdicionarMensagem;
    private javax.swing.JList jlistComunidades;
    private javax.swing.JList jlistForuns;
    private javax.swing.JList jlistForunsAtuais;
    private javax.swing.JList jlistusuarios;
    private javax.swing.JPanel jpRecados;
    private javax.swing.JTextArea txtAreaMensagem;
    private javax.swing.JTextArea txtAreaRecado;
    // End of variables declaration//GEN-END:variables

//<editor-fold defaultstate="collapsed" desc="Métodos de controle">
    /**
     * Adicionar novo usuario
     */
    protected void adicionarUsuario(Map<String, Usuario> usuarios) {
        this.usuarios = usuarios;

        preencherListaUsuarios();
        this.setVisible(true);

    }

    /**
     * Preencher JList de comunidades
     * @author Italo Ney
     */
    private void preencherListaComunidades() {

        //preencher lista de comunidades
        if (this.comunidades.size() > 0) {
            DefaultListModel dlm = new DefaultListModel();

            for (Comunidade comunidade : this.comunidades.values()) {
                dlm.addElement(comunidade);
            }

            jlistComunidades.setModel(dlm);
        }
    }

    /**
     * Preencher JList de foruns
     * @author Italo Ney
     */
    private void preencherListaForuns() {

        //preencher lista de foruns
        if (this.foruns.size() > 0) {
            DefaultListModel dlm = new DefaultListModel();

            for (Forum forum : this.foruns.values()) {
                dlm.addElement(forum);
            }

            jlistForunsAtuais.setModel(dlm);
        }
    }

    /**
     * @author italoney
     * Atualizar a lisa das comunidades
     * @param comunidades comundades que devem ser atualizadas
     */
    protected void atualizarListaComunidade(Map<String, Comunidade> comunidades) {
        this.setVisible(true);
        this.comunidades = comunidades;
        preencherListaComunidades();
    }

    /**
     * @author italoney
     * Preencher lsita de usuários
     */
    private void preencherListaUsuarios() {
        DefaultListModel dlm = new DefaultListModel();

        for (Usuario usuario : this.usuarios.values()) {
            dlm.addElement(usuario);
        }
        jListusuariosAtuais.setModel(dlm);
    }

    /**
     * @author italoney
     * Atulizar todas as listas, usuairos,foruns,comundiades
     * @param comunidades comunidades a serem atualizadas
     * @param usuarios usuários a serem atualizados
     * @param foruns forus a serem atualizados
     */
    protected void atualizarListas(Map<String, Comunidade> comunidades, Map<String, Usuario> usuarios, Map<String, Forum> foruns) {
        this.salvo = false;
        this.setVisible(true);

        this.comunidades = comunidades;
        this.usuarios = usuarios;
        this.foruns = foruns;

        preencherListaComunidades();
        preencherListaUsuarios();
        preencherListaForuns();

    }

    /**
     *@author italoney
     * Inicializar os campos do formulario
     */
    private void inicializarCampos() {
        DefaultListModel dlm = new DefaultListModel();

        jListusuariosAtuais.setModel(dlm);
        jlistForunsAtuais.setModel(dlm);

        jlistForuns.setModel(dlm);
        jlistComunidades.setModel(dlm);
        jlistusuarios.setModel(dlm);

        txtAreaMensagem.setText("");
//        txtAreaMensagem.setEditable(false);
        txtAreaRecado.setText("");
//        txtAreaRecado.setEditable(false);

        jbAdicinarRecado.setEnabled(false);
        jbAdicionarMensagem.setEnabled(false);

        UIManager.put("OptionPane.cancelButtonText", "Cancelar");
        UIManager.put("OptionPane.noButtonText", "Não");
        UIManager.put("OptionPane.yesButtonText", "Sim");

    }

    /**
     * @author italoney
     * Gerar arquivo de configuração
     * @param opcao Modo de salvamento de dados
     */
    private void generateConfigFile(String opcao) {
        File file = new File(ArquivoPath.CONGIF_FILE);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException ex) {
                Logger.getLogger(jfrmPrincipal.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {

            try {
                BufferedWriter bw = new BufferedWriter(new FileWriter(ArquivoPath.CONGIF_FILE));
                bw.write(opcao);
                bw.close();
            } catch (IOException ex) {
                Logger.getLogger(jfrmPrincipal.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    /**
     * @author italoney
     * Ler arquivo de configuração
     * @param file Caminho do arquivo
     * @return retorna um código correspondente ao tipo de salvamento 1 = <b>XML</b> 2 = <b>BYTES</b>
     */
    private int readConfigFile(String file) {
        File f = new File(file);
        BufferedReader br;
        String formatLeitura = "xml";
        int valorLeitura = formatLeitura.hashCode();
        if (f.exists()) {
            try {
                br = new BufferedReader(new FileReader(file));
                try {
                    if (br.readLine() != null) {
                        int result = 0;
                        while (br.ready()) {
                            result = Integer.parseInt(br.readLine());
                        }
                        br.close();
                        if (result == valorLeitura) {
                            return 1;
                        } else {
                            return 2;
                        }
                    } else {
                        return 1;
                    }
                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(null, "Erro ao ler arquivo de "
                            + "configuração", "Erro", JOptionPane.ERROR_MESSAGE);
                }
            } catch (FileNotFoundException ex) {
                JOptionPane.showMessageDialog(null, "Arquivo de configuração não "
                        + "encontrado", "Erro", JOptionPane.ERROR_MESSAGE);
            } catch (NumberFormatException e) {
                JOptionPane.showMessageDialog(null, "Arquivo de configuração não "
                        + "possui valores válidos", "Erro", JOptionPane.ERROR_MESSAGE);
            }

        } else {
            generateConfigFile(file);
            return 1;
        }
        return 1;
    }

    /**
     * @author italoney
     * Carregar dados salvos
     */
    private void careegarDados() {
        SaveSerialized ss = new SaveSerialized();
        File info = new File(ArquivoPath.COMUNIDADEXML);


        if (this.MODO_SALVAR == 1) {
            if (info.exists()) {
                this.comunidades = ss.xmlReadComunidades(ArquivoPath.COMUNIDADEXML);
            }


            info = new File(ArquivoPath.USUARIOXML);
            if (info.exists()) {
                this.usuarios = ss.xmlReadUsuarios(ArquivoPath.USUARIOXML);

            }

            info = new File(ArquivoPath.FORUMXML);
            if (info.exists()) {

                this.foruns = ss.xmlReadForuns(ArquivoPath.FORUMXML);
            }

        } else {
            info = new File(ArquivoPath.FORUMBYTES);
            if (info.exists()) {
                this.foruns = ss.desserializaMapForuns(ArquivoPath.FORUMBYTES);
            }

            info = new File(ArquivoPath.COMUNIDADEBYTES);
            if (info.exists()) {
                this.comunidades = ss.desserializaMapComunidades(ArquivoPath.COMUNIDADEBYTES);
            }

            info = new File(ArquivoPath.USUARIOBYTES);
            if (info.exists()) {
                this.usuarios = ss.desserializaMapUsuarios(ArquivoPath.USUARIOBYTES);
            }
        }

        atualizarListas(this.comunidades, this.usuarios, this.foruns);
    }

    /**
     * @author italoney
     * Salvar dados
     */
    private void salvarDados() {
        SaveSerialized ss = new SaveSerialized();
        if (this.MODO_SALVAR == 1) {
            try {
                ss.xmlMapComunidades(this.comunidades, ArquivoPath.COMUNIDADEXML);
                ss.xmlMapUsuarios(this.usuarios, ArquivoPath.USUARIOXML);
                ss.xmlMapForuns(this.foruns, ArquivoPath.FORUMXML);
                this.salvo = true;
                JOptionPane.showMessageDialog(null, "Dados salvos!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null, "Erro ao salvar dados!", "Erro", JOptionPane.ERROR_MESSAGE);
            }
        } else {
            try {
                ss.serializaMapComunidades(this.comunidades, ArquivoPath.COMUNIDADEBYTES);
                ss.serializaMapForuns(this.foruns, ArquivoPath.FORUMBYTES);
                ss.serializaMapUsuarios(this.usuarios, ArquivoPath.USUARIOBYTES);
                this.salvo = true;
                JOptionPane.showMessageDialog(null, "Dados salvos!", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null, "Erro ao salvar dados!", "Erro", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    /**
     * @author italoney
     * Configurar menu popup
     */
    private void jfrmMenu() {
        // criar uma lista com os menus
        JMenuItem menuRemUsuario = new JMenuItem(MenuPopupOptions.REMOVER_USUARIO);
        JMenuItem menuRemComunidade = new JMenuItem(MenuPopupOptions.REMOVER_COMUNIDADE);
        JMenuItem monuRemForum = new JMenuItem(MenuPopupOptions.REMOVER_FORUM);
        JMenuItem menuFileSaveAs = new JMenuItem(MenuPopupOptions.REMOVER_MENSAGEM_FORUM);
        JMenuItem menuFileExit = new JMenuItem(MenuPopupOptions.REMOVER_RECADO_USUARIO);

        // adicioar menus na popup
        popupMenu = new JPopupMenu("Menu");
        popupMenu.add(menuRemUsuario);
        popupMenu.add(menuRemComunidade);
        popupMenu.add(monuRemForum);
        popupMenu.add(menuFileSaveAs);
        popupMenu.add(menuFileExit);

        this.add(popupMenu);

        // eventos quando clicar em cada item do menu
        enableEvents(AWTEvent.MOUSE_EVENT_MASK);
        menuRemUsuario.addActionListener(this);
        menuRemComunidade.addActionListener(this);
        monuRemForum.addActionListener(this);
        menuFileSaveAs.addActionListener(this);
        menuFileExit.addActionListener(this);
    }

    @Override
    public void processMouseEvent(MouseEvent event) {
        if (event.isPopupTrigger()) {
            popupMenu.show(event.getComponent(), event.getX(), event.getY());
        }
        super.processMouseEvent(event);
    }

    @Override
    public void actionPerformed(ActionEvent event) {

        //<editor-fold defaultstate="collapsed" desc="REMOVER USUARIO">
        if (event.getActionCommand().equals(MenuPopupOptions.REMOVER_USUARIO)) {

            if (jListusuariosAtuais.getSelectedValues().length > 0) {
                Usuario user = (Usuario) jListusuariosAtuais.getSelectedValue();
                this.usuarios.remove(user.getNome());
                for (Comunidade c : this.comunidades.values()) {
                    c.removerUsuario(user);
                    System.out.println(c);
                    System.out.println(user);
                }
                this.atualizarListas(comunidades, usuarios, foruns);
            } else {
                JOptionPane.showMessageDialog(null, "Selecione um usuário.", "Erro", JOptionPane.ERROR_MESSAGE);
            }
        }
        //</editor-fold>

        //<editor-fold defaultstate="collapsed" desc="REMOVER COMUNIDADE">
        if (event.getActionCommand().equals(MenuPopupOptions.REMOVER_COMUNIDADE)) {


            if (jlistComunidades.getSelectedValues().length > 0) {
                Comunidade comunidade = (Comunidade) jlistComunidades.getSelectedValue();

                System.out.printf(comunidade.getTitulo());
                this.comunidades.remove(comunidade.getTitulo());

                atualizarListas(comunidades, usuarios, foruns);
            } else {
                JOptionPane.showMessageDialog(null, "Selecione uma comunidade.", "Erro", JOptionPane.ERROR_MESSAGE);
            }
        }
        //</editor-fold>

        //<editor-fold defaultstate="collapsed" desc="REMOVER FORUM">
        if (event.getActionCommand().equals(MenuPopupOptions.REMOVER_FORUM)) {
            Forum forum;
            if (jlistForunsAtuais.getSelectedValues().length == 1) {
                forum = (Forum) jlistForunsAtuais.getSelectedValue();
                for (Comunidade comunidade : this.comunidades.values()) {

                    if (comunidade instanceof ComunidadePrivada) {
                        ComunidadePrivada cp = (ComunidadePrivada) comunidade;
                        cp.removerForum(forum);
                    }
                    this.foruns.remove(forum.getTitulo());
                    atualizarListas(comunidades, usuarios, foruns);
                }
//            } else if (jlistForuns.getSelectedValues().length == 1) {
//                forum = (Forum) jlistForuns.getSelectedValue();
//                for (Comunidade comunidade : this.comunidades.values()) {
//
//                    if (comunidade instanceof ComunidadePrivada) {
//                        ComunidadePrivada cp = (ComunidadePrivada) comunidade;
//                        cp.removerForum(forum);
//                    }
//                    this.foruns.remove(forum.getTitulo());
//                    atualizarListas(comunidades, usuarios, foruns);
//                }
            } else {
                JOptionPane.showMessageDialog(null, "Selecione um forum.", "Erro", JOptionPane.ERROR_MESSAGE);
            }
        }
        //</editor-fold>

        //<editor-fold defaultstate="collapsed" desc="REMOVER MENSAGEM DE FORUM">
        if (event.getActionCommand().equals(MenuPopupOptions.REMOVER_MENSAGEM_FORUM)) {
            Forum forum = null;

            if (jlistForunsAtuais.getSelectedValues().length == 1) {
                forum = (Forum) jlistForunsAtuais.getSelectedValue();
                /*} else if (jlistForuns.getSelectedValues().length == 1) {
                forum = (Forum) jlistForuns.getSelectedValue();*/
            } else {
                JOptionPane.showMessageDialog(null, "Selecione um forum.", "Erro", JOptionPane.ERROR_MESSAGE);
            }

            if (forum != null) {
                jfrmRemoverMensagem removerMensagem = new jfrmRemoverMensagem(forum,
                        this.comunidades, this.foruns, this.usuarios);
                removerMensagem.show();
                this.dispose();
            }
        }
        //</editor-fold>

        //<editor-fold defaultstate="collapsed" desc="REMOVER RECADO DE USUARIO">
        if (event.getActionCommand().equals(MenuPopupOptions.REMOVER_RECADO_USUARIO)) {
            Usuario usuario = null;

            if (jListusuariosAtuais.getSelectedValues().length == 1) {
                usuario = (Usuario) jListusuariosAtuais.getSelectedValue();
                /*} else if (jlistForuns.getSelectedValues().length == 1) {
                usuario = (Usuario) jlistusuarios.getSelectedValue();*/
            } else {
                JOptionPane.showMessageDialog(null, "Selecione um usuário.", "Erro", JOptionPane.ERROR_MESSAGE);
            }

            if (usuario != null) {
                if (usuario instanceof UsuarioVip) {
                    jfrmRemoverRecado removerRecado = new jfrmRemoverRecado(usuario,
                            this.comunidades, this.foruns, this.usuarios);
                    removerRecado.show();
                    this.dispose();
                } else {
                    JOptionPane.showMessageDialog(null, usuario.getNome() + " não é usuário VIP\npor isso não possuio recados.",
                            "Erro", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        //</editor-fold>

    }
}
